// // Object.defineProperties 不兼容 ie8

// 对象数据劫持实现

function Mvvm(options = {}) {
  this.$options = options;
  this.$el = options.$el;
  const data = (this._data = options.data);
  observe(data);

  for (let key in data) {
    // 将 data 的数据挂在 this 上
    Object.defineProperty(this, key, {
      enumerable: true,
      get() {
        return this._data[key];
      },
      set(newVal) {
        // 这个设置值的过程会被 Observe 类拦截
        this._data[key] = newVal;
      },
    });
  }
  if (this.$el) {
    new Compile(this.$el, this);
  }
}

/**
 * 观察对象 给对象增加监听器
 */
function observe(data) {
  if (typeof data !== 'object') return;
  return new Observe(data);
}

// 监听器类
function Observe(data) {
  for (let key in data) {
    let value = data[key];
    value = observe(value);
    Object.defineProperty(data, key, {
      enumerable: true,
      get() {
        return value;
      },
      set(newVal) {
        // 更改值
        if (newVal === value) {
          // 值没有变化
          return;
        }
        value = newVal;
        observe(newVal);
      },
    });
  }
}
